package org.example.oop.thread;

import java.util.concurrent.*;

/**
 * org.example.oop.thread
 *
 * @author moLei
 * @description 线程池
 * @date 2025/6/26
 */
public class ThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            executorService.submit(
                    new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("world");
                        }
                    }
            );
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello");
                }
            });
        }


        ExecutorService executorService1 = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            executorService1.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("1");
                }
            });
        }
        // 等待队列没满时只会创建核心线程进行执行，等待线程满后会创建对应的线程执行新进的任务，而队列中的任务依旧在进行等待，线程池创建完最大线程数量且队列也是满的，这是新的任务就会进入任务拒绝策略
        /*
        ThreadPoolExecutor.AbortPolicy  默认策略：丢弃任务并抛出RejectedExecutionException异常
        DiscardPolicy                   丢弃任务，但是不抛出异常（不推荐）
        DiscardOldestPolicy             抛弃队列中等待时间最久的任务，然后把当前任务加入队列中
        CallerRunsPolicy                调用任务的run（）方法绕过线程池直接执行
         */
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3,
                10,
                3000,   // 临时线程最大存活时间
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(3),   //Linked没有指定长度，最大可到int的最大值，Array可以指定长度
                Executors.defaultThreadFactory(),       // 创建线程工厂
                new ThreadPoolExecutor.DiscardOldestPolicy());
    }
}
